# -*- coding: utf-8 -*-
"""
路由管理器

整合所有API接口模块，提供统一的路由注册功能
"""

import os

from flask import Flask, redirect, send_from_directory

from .任务接口 import 任务接口蓝图, 初始化任务接口
from .历史数据接口 import 历史数据接口蓝图, 初始化历史数据接口
from .校验接口 import 校验接口蓝图, 初始化校验接口
from .系统接口 import 系统接口蓝图, 初始化系统接口


class 路由管理器:
    """
    路由管理器类
    
    负责注册所有API接口蓝图并初始化依赖
    """

    def __init__(self):
        self.已初始化 = False

    def 注册路由(self, 应用程序: Flask, **依赖项):
        """
        注册所有API路由到Flask应用
        
        参数:
            应用程序: Flask应用实例
            **依赖项: 各接口模块需要的依赖项
        """
        if self.已初始化:
            return

        # 初始化任务接口
        初始化任务接口(
            任务执行器=依赖项.get('任务执行器'),
            任务状态字典=依赖项.get('任务状态字典'),
            任务状态锁=依赖项.get('任务状态锁'),
            执行总结字典=依赖项.get('执行总结字典'),
            执行总结锁=依赖项.get('执行总结锁'),
            任务状态常量=依赖项.get('任务状态常量'),
            日志记录器=依赖项.get('日志记录器'),
            创建任务=依赖项.get('创建任务'),
            获取任务状态=依赖项.get('获取任务状态'),
            更新任务状态=依赖项.get('更新任务状态'),
            浏览器自动化任务执行=依赖项.get('浏览器自动化任务执行')
        )

        # 初始化校验接口
        初始化校验接口(
            执行总结字典=依赖项.get('执行总结字典'),
            执行总结锁=依赖项.get('执行总结锁'),
            校验错误信息列表=依赖项.get('校验错误信息列表'),
            日志记录器=依赖项.get('日志记录器'),
            获取用户缓存=依赖项.get('获取用户缓存'),
            总结校验未通过项目_rich=依赖项.get('总结校验未通过项目_rich')
        )

        # 初始化历史数据接口
        初始化历史数据接口(
            执行总结字典=依赖项.get('执行总结字典'),
            执行总结锁=依赖项.get('执行总结锁'),
            日志记录器=依赖项.get('日志记录器'),
            获取用户缓存=依赖项.get('获取用户缓存')
        )

        # 初始化系统接口
        初始化系统接口(
            任务状态字典=依赖项.get('任务状态字典'),
            执行总结字典=依赖项.get('执行总结字典')
        )

        # 注册所有蓝图
        应用程序.register_blueprint(任务接口蓝图)
        应用程序.register_blueprint(校验接口蓝图)
        应用程序.register_blueprint(历史数据接口蓝图)
        应用程序.register_blueprint(系统接口蓝图)

        # 为了兼容性，注册一些旧的路由路径
        self._注册兼容性路由(应用程序)

        self.已初始化 = True

    def _注册兼容性路由(self, 应用程序: Flask):
        """
        注册兼容性路由，保持与原有接口路径的兼容性
        """
        # 健康检查接口的兼容性路由
        @应用程序.route('/健康检查', methods=['GET'])
        def 健康检查兼容():
            from .系统接口 import 健康检查接口
            return 健康检查接口()

        # 任务相关接口的兼容性路由
        @应用程序.route('/启动任务', methods=['POST'])
        def 启动任务兼容():
            from .任务接口 import 启动任务接口
            return 启动任务接口()

        @应用程序.route('/任务状态/<task_id>', methods=['GET'])
        def 获取任务状态兼容(task_id):
            from .任务接口 import 获取任务状态接口
            return 获取任务状态接口(task_id)

        @应用程序.route('/任务列表', methods=['GET'])
        def 获取任务列表兼容():
            from .任务接口 import 获取任务列表接口
            return 获取任务列表接口()

        @应用程序.route('/取消任务/<task_id>', methods=['POST'])
        def 取消任务兼容(task_id):
            from .任务接口 import 取消任务接口
            return 取消任务接口(task_id)

        @应用程序.route('/停止任务', methods=['POST'])
        def 停止任务兼容():
            from .任务接口 import 停止任务接口
            return 停止任务接口()

        @应用程序.route('/提交执行总结/<task_id>', methods=['POST'])
        def 提交执行总结兼容(task_id):
            from .任务接口 import 提交执行总结接口
            return 提交执行总结接口(task_id)

        @应用程序.route('/获取执行总结/<task_id>', methods=['GET'])
        def 获取执行总结兼容(task_id):
            from .任务接口 import 获取执行总结接口
            return 获取执行总结接口(task_id)

        @应用程序.route('/获取所有执行总结', methods=['GET'])
        def 获取所有执行总结兼容():
            from .任务接口 import 获取所有执行总结接口
            return 获取所有执行总结接口()

        # 校验相关接口的兼容性路由
        # @应用程序.route('/推送校验结果', methods=['POST'])
        # def 推送校验结果兼容():
        @应用程序.route('/推送校验结果', methods=['POST'])
        def 推送校验结果兼容():
            from .校验接口 import 推送校验结果接口
            return 推送校验结果接口()

        @应用程序.route('/获取错误日志', methods=['GET'])
        def 获取错误日志兼容():
            from .校验接口 import 获取错误日志接口
            return 获取错误日志接口()

        @应用程序.route('/获取校验错误总结', methods=['GET'])
        def 获取校验错误总结兼容():
            from .校验接口 import 获取校验错误总结接口
            return 获取校验错误总结接口()

        @应用程序.route('/清空错误日志', methods=['POST'])
        def 清空错误日志兼容():
            from .校验接口 import 清空错误日志接口
            return 清空错误日志接口()

        # 历史数据相关接口的兼容性路由
        @应用程序.route('/获取推送结果/<document_number>', methods=['GET'])
        def 获取推送结果兼容(document_number):
            from .历史数据接口 import 获取推送结果接口
            return 获取推送结果接口(document_number)

        @应用程序.route('/获取所有推送结果', methods=['GET'])
        def 获取所有推送结果兼容():
            from .历史数据接口 import 获取所有推送结果接口
            return 获取所有推送结果接口()

        @应用程序.route('/历史数据/查询', methods=['GET'])
        def 查询历史数据兼容():
            from .历史数据接口 import 查询历史数据
            return 查询历史数据()

        @应用程序.route('/历史数据/删除/<document_number>', methods=['DELETE'])
        def 删除历史数据兼容(document_number):
            from .历史数据接口 import 删除历史数据
            return 删除历史数据(document_number)

        @应用程序.route('/历史数据/批量删除', methods=['POST'])
        def 批量删除历史数据兼容():
            from .历史数据接口 import 批量删除历史数据
            return 批量删除历史数据()

        @应用程序.route('/历史数据/清理', methods=['POST'])
        def 清理历史数据兼容():
            from .历史数据接口 import 清理历史数据
            return 清理历史数据()

        @应用程序.route('/历史数据/统计', methods=['GET'])
        def 获取历史数据统计兼容():
            from .历史数据接口 import 获取历史数据统计
            return 获取历史数据统计()

        # 根路径重定向到前端登录页
        @应用程序.route('/', methods=['GET'])
        def 根路径重定向到登录():
            return redirect('/login', code=302)

        # 前端登录页与静态资源（dist）
        @应用程序.route('/login', methods=['GET'])
        def 前端登录页面():
            try:
                return send_from_directory('dist', 'index.html')
            except Exception:
                return '前端构建文件未找到，请先构建前端并将产物放置在项目根目录的 dist 目录下', 404

        @应用程序.route('/assets/<path:filename>', methods=['GET'])
        def 前端静态资源(filename):
            return send_from_directory('dist/assets', filename)

        # SPA 通配回退：除 API 与静态资源以外的任意前端路由，统一回退到 index.html
        @应用程序.route('/<path:subpath>', methods=['GET'])
        def SPA通配回退(subpath):
            # 对 /api/* 的未知路径，不应回退到前端，而是返回 404，避免掩盖接口错误
            if subpath.startswith('api/'):
                return 'Not Found', 404

            # 若 dist 中存在对应静态文件（极少数直链资源），直接返回该文件
            dist_target = os.path.join('dist', subpath)
            if os.path.isfile(dist_target):
                try:
                    # 这里允许直接返回 dist 下的任意文件（如 favicon、manifest 等）
                    return send_from_directory('dist', subpath)
                except Exception:
                    pass

            # 其他情况均回退到前端入口文件，由前端路由（如 /monitor 等）接管
            try:
                return send_from_directory('dist', 'index.html')
            except Exception:
                return '前端构建文件未找到，请先构建前端并将产物放置在项目根目录的 dist 目录下', 404


# 创建全局路由管理器实例
路由管理器实例 = 路由管理器()